package cn.dengta.webapp.user.model;

import java.util.Date;
import java.util.Set;
import javax.annotation.Nonnull;

import cn.dengta.common.model.Bean;
import cn.dengta.common.util.Formats;
import cn.dengta.context.model.*;
import me.codeplayer.util.StringUtil;
import me.codeplayer.util.X;

/**
 * 用户素描（对用户常用信息的基本抽象）
 */
public interface UserSketch extends Bean<Long> {

	Gender getGender();

	String getNickname();

	Language getLanguage();

	String getAvatar();

	String getCountry();

	String getRegCountry();

	Long getAgentId();

	boolean vip();

	Date getBirthday();

	WesKit getWesKit();

	/** 是否注册自中国大陆 */
	boolean inChina();

	/** 仅支持使用钻石聊天 */
	default boolean acceptCoinOnly() {
		return getGender() == Gender.FEMALE && inChina();
	}

	/** 已知的官方人员号 */
	Set<Long> officialUserIds = Set.of(1L, 2L, 3L, 8L, 9L);

	/** 是否是官方人员 */
	default boolean official() {
		// TODO 系统号、客服号、官方运营号、超管号等
		return officialUserIds.contains(getId());
	}

	default Set<Long> officialIds() {
		return officialUserIds;
	}

	/** 是否是单向付费（对方付费） */
	boolean biasedPay();

	/** 是否可直播 */
	boolean canLive();

	default String getConstellation() {
		return Zodiac.calcConstellation(getBirthday());
	}

	default String gender_() {
		final Gender gender = getGender();
		return gender == null ? null : gender.getLabel();
	}

	/** 获取年龄 */
	default Integer age() {
		final Date birthday = getBirthday();
		return birthday == null ? null : Formats.getAge(birthday);
	}

	@Nonnull
	default Gender genderOrDefault() {
		return Gender.getOrDefault(getGender());
	}

	default String genderOrDefaultAvatar() {
		return Gender.getOrDefaultAvatar(genderOrDefault(), WesKit.ofIdWesKit(getId()));
	}

	default boolean freeze() {
		return false;
	}

	@Nonnull
	default String avatarOrDefault() {
		final String avatar = getAvatar();
		WesKit wesKit = getWesKit();
		wesKit = wesKit == null ? WesKit.ofIdWesKit(getId()) : wesKit;
		return StringUtil.isEmpty(avatar) || freeze() ? Gender.getOrDefaultAvatar(genderOrDefault(), wesKit) : avatar;
	}

	@Nonnull
	default Country defaultCountry() {
		Country country = X.map(getCountry(), Country::of);
		return country != null ? country : getLanguage().getCountry();
	}

}
